/**
 * 
 */
package com.witframework.core.persistence;

import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

import com.witframework.core.persistence.BaseJdbcDao.SimpleParameterizedRowToMapsMapper;

/**
 * @author wuxinyang
 * Jun 12, 2009 2:13:28 PM
 * 
 */
public interface IBaseJdbcDao {
	DataSource getDataSource();
	SimpleJdbcTemplate getSimpleJdbcTemplate();
	public void insert(String tableName,Map<String,Object> data);
	public void insertByWebMap(String tableName,Map<String,String> data);
	public void deleteBy(String tableName,String key,String vlaue);
	public void update(String tableName,Map<String,Object> data);	
	public void updateByWebMap(String tableName,Map<String,String> data);
	public void delete(String tableName,Map<String,Object> data);
	public void deleteByWebMap(String tableName,Map<String,String> data);
	public List<Map> getTableMetaData(String tableName,String type);
	
	/**
	 * 单对象查询,通过给定的ParameterizedRowMapper实现，将查询的记录集数据映射到数据实体对象
	 * @param sql - SQL查询语句
	 * @param mapper - ParameterizedRowMapper接口的实现，将rs中的字段映射到实体类
	 * @param args - 查询参数
	 * @return - 查询到的数据实体对象
	 */
	public abstract Object queryForObject(String sql, ParameterizedRowMapper<?> mapper, Object... args);
	public abstract Map queryForMap(String sql, Object... args);
	/**
	 * 单对象查询,通过给定的实体类类型entityClass，将查询的记录集数据映射到数据实体对象
	 * 使用了ParameterizedRowMapper接口的实现类SimpleParameterizedRowMapper将记录集数据映射到数据实体对象
	 * 一般情况下总是应该实现自己的ParameterizedRowMapper.<br>
	 * 匹配规则:
	 * <pre>采用默认的映射规则：
	 * （"select * from INFORMATION where well_id=?",Information.class,"1000001"）
	 *	中将字段well_id的值自动映射到CommWellInformation的属性wellId(注意well_id到wellId)；
	 *	well_name的值自动映射到CommWellInformation的属性wellName(注意well_name到wellName)；
	 *	这里well_id和well_name分别为sql查询结果记录集中的字段名称。
	 *	显式的别名指定规则：
	 *	（"select well_id wellId ,well_name wellName from COMM_WELL_INFORMATION where well_id=?",CommWellInformation.class,"1000001"）
	 *	注意：“well_id wellId ,well_name wellName”语句指定的well_id别名“wellId”为和well_name的别名为“wellName”
	 *	</pre>
	 * @param sql - SQL查询语句
	 * @param entityClass - 要记录集数据映射到的实体类
	 * @param args - 可变查询参数
	 * @return - 查询到的数据实体对象
	 * @see #queryForObject(String, ParameterizedRowMapper, Object[])
	 */
	public abstract <T> T queryForObject(String sql, Class<T> entityClass, Object... args);

	public abstract List<?> queryForList(String sql, Object... args);

	/**
	 * 
	 * 查询,通过给定的ParameterizedRowMapper实现，将查询的记录集数据映射到数据实体对象	 *
	 * @param sql - SQL查询语句
	 * @param args - 可变查询参数
	 * @return - 包含数据列表的List
	 */

	public abstract List<?> queryForList(String sql, ParameterizedRowMapper mapper, Object... args);

	/**
	 * 
	 * 查询,通过给定的实体类类型entityClass，将查询的记录集数据映射到数据实体对象
	 * 使用了ParameterizedRowMapper接口的实现类SimpleParameterizedRowMapper将记录集数据映射到数据实体对象
	 * 一般情况下总是应该实现自己的ParameterizedRowMapper
	
	 * @param sql - SQL查询语句
	 * @param entityClass - 要映射到的实体类
	 * @param args - 可变查询参数
	 * @return - 包含数据列表的List对象
	 * @see #queryForList(String sql,ParameterizedRowMapper mapper,Object...args)
	 */
	public abstract List queryForList(String sql, Class entityClass, Object... args);

	/**
	 * 查询,database属性决定了数据库类型
	 * @param psm
	 * @param sql
	 * @param mapper
	 * @param args
	 * @return List<Object>
	 */
	public abstract List pageQuery(PageSortModel psm, String sql, ParameterizedRowMapper mapper, Object... args);

	/**
	 * 该方法只适用于oracle
	 * 查询,通过给定的ParameterizedRowMapper实现，将查询的记录集数据映射到数据实体对象
	 *
	 * @param sql - SQL查询语句
	 * @param mapper -ParameterizedRowMapper
	 * @param args - 可变查询参数
	 * @return - 包含数据列表的PageModel对象
	 */
	public abstract List pageQuery4Oracle(PageSortModel psm, String sql, ParameterizedRowMapper mapper, Object... args);

	/**
	 * 该方法只适用于mysql
	 */
	public abstract List pageQuery4MySql(PageSortModel psm, String sql, ParameterizedRowMapper mapper, Object... args);

	/**
	 * 该方法只适用于HSQL
	 */
	public abstract List pageQuery4HSql(PageSortModel psm, String sql, ParameterizedRowMapper mapper, Object... args);

	public abstract List pageQuery4Other(PageSortModel psm, String sql, ParameterizedRowMapper mapper, Object... args);

	/**
	 * 分页查询，database属性决定了数据库类型
	 * @param psm
	 * @param sql
	 * @param args 可变查询参数
	 * @return List<Map>
	 */
	public abstract List pageQuery(PageSortModel psm, String sql, Object... args);

	/**
	 * 分页查询，database属性决定了数据库类型
	 * @param psm
	 * @param sql
	 * @param entityClass
	 * @param args 可变查询参数
	 * @return List<Object>
	 */
	public abstract List pageQuery(PageSortModel psm, String sql, Class entityClass, Object... args);

	/**
	 * 该方法只适用于Oracle
	 * 分页查询,通过给定的实体类类型entityClass，将查询的记录集数据映射到数据实体对象
	 * 使用了ParameterizedRowMapper接口的实现类SimpleParameterizedRowMapper将记录集数据映射到数据实体对象
	 * 一般情况下总是应该实现自己的ParameterizedRowMapper
	 * @param sql - SQL查询语句
	 * @param entityClass - 要映射到的实体类
	 * @param args - 可变查询参数
	 * @return - 包含数据列表的PageModel对象
	 * @see #pageQuery4Oracle(PageSortModel psm,String sql,ParameterizedRowMapper mapper,Object...args)
	 */
	public abstract List pageQuery4Oracle(PageSortModel psm, String sql, Class entityClass, Object... args);

	/**
	 * 该方法只适用于mysql
	 */
	public abstract List pageQuery4MySql(PageSortModel psm, String sql, Class entityClass, Object... args);

	/**
	 * 该方法只适用于HSQL
	 */
	public abstract List pageQuery4HSql(PageSortModel psm, String sql, Class entityClass, Object... args);
	/**
	 * 该方法只适用于Sqlserver
	 */
	public abstract List pageQuery4Sqlserver(PageSortModel psm, String sql, Class entityClass, Object... args);

	public abstract List pageQuery4Other(PageSortModel psm, String sql, Class entityClass, Object... args);

	public abstract void setDatabase(String database);

}